package frame

// import (
// 	"bytes"
// 	"fmt"
// 	"io"
// )

// /* 这里是数据帧相关，数据帧frame的结构：
// - 帧Header：4byte|帧数据的长度，因为我们还是以帧为模具，从流（[]byte）中捞上来
// - payload：实际的数据，不限长度
// frame对接的是IO接口
// encode将数据包中的数据传递给IO接口
// */

// // 消息体
// type MyFramePayload []byte

// // 数据帧frame应该也是需要接口约束，可以完成数据帧的收发
// /* 建立了这个抽象之后，表示frame这个结构主要的动作 */
// type StreamFrameCodec interface {
// 	// 解码表示从IO接口中拿取出来
// 	Decode(io.Reader) (MyFramePayload, error)
// 	// 解码表示将frame发送到IO接口中
// 	Encode(io.Writer, MyFramePayload) error
// }

// // 编码
// /* 这里有一个约定的，计算长度是下沉到这里来完成，上层（比如我的服务层，数据计算好了或者查找出来了要返回给客户端）就只专注于业务与数据传递。
// 下层自己的元数据，还是放到下层计算。
// 就像路由树的查找的情况，关于节点是否有子节点已经关于当前查找出来的优先级问题，直接交给节点自己完成，而不是在上层“树”的时候帮它做。
// 这样会使得代码分工明确，修改也方便。 */
// func Encode(w io.Writer, framePayload MyFramePayload) error {
// 	// 计算长度
// 	frameLen := len(framePayload) // 因为是[]byte，所以这样子就直接可以
// 	MyFrame := make([]byte, 0, frameLen+4)

// 	// 填充
// 	MyFrame = append(MyFrame, byte(frameLen))
// 	MyFrame = append(MyFrame, framePayload...)

// 	// 发送
// 	n, err := w.Write(MyFrame)
// 	if err != nil {
// 		return fmt.Errorf("write the stream fail:%v", err)
// 	}
// 	if n != frameLen+4 {
// 		return fmt.Errorf("write the stream fali:%v", n)
// 	}
// 	return nil
// }

// func Decode(r io.Reader) (MyFramePayload, error) {
// 	MyFrame := []byte{}
// 	n, err := r.Read(MyFrame)
// 	if nil != err {
// 		return nil, fmt.Errorf("read the stream fail:%v", err)
// 	}

// 	return bytes.Join(
// 		[][]byte{
// 			{byte(n)},
// 			MyFrame,
// 		}, nil,
// 	), nil
// }
